package n2_common_methods;


import lombok.extern.slf4j.Slf4j;

/**
 * -------------------------------------------
 *    yield 和 sleep                         /
 * ===========================================
 * yield: 让线程 从Running 进入 Runnable(就绪状态) ，然后调度执行其它线程
 *        具体实现依赖于操作系统的 [-任务调度器-]（想把CPU时间片分出去，但是没有其它线程了，所以还是[可能]会执行当前线程）
 * 相比于 sleep : yield - 让线程就绪 但是并不一定不执行(具体看任务调度器)
 *               sleep - 让程序睡眠 任务调度器不会 将时间片 分给阻塞线程，但是会分给就绪的线程
 *
 *
 * -------------------------------------------
 *    Thread.class里的优先级                  /
 * ===========================================
 * MIN_PRIORITY =1;  --- 线程可以具有的最小优先级.
 * NORM_PRIORITY=5;  --- 分配给线程的默认优先级.
 * MAX_PRIORITY =10; --- 线程可以具有的最大优先级.
 *
 * 线程优先级会提示（hint）调度器优先调度该线程，但它仅仅是一个提示，调度器可以忽略它
 * 如果 cpu 比较忙，那么优先级高的线程会获得更多的时间片，但 cpu 闲时，优先级几乎没作用
 *
 * 方法 有 ： yield(让出时间片) 和 setPriority(设置优先级)  【注意：最终其实还是由操作系统的 任务调度器 决定的】
 *
 *
 */
@Slf4j(topic = "c.")
public class T4_yield_vs_sleep {

    public static void main(String[] args) {

        Runnable  task1 = () -> {
            int count = 0;
            for (;;){
                System.out.println("------>1===" + count++);
            }
        };

        Runnable  task2 = () -> {
            int count = 0;
            for (;;){
                Thread.yield(); // 让出 CPU时间片
                System.out.println("            ------>2===" + count++);
            }
        };

        Thread t1 = new Thread(task1, "t1");
        Thread t2 = new Thread(task2, "t2");

        t1.setPriority(Thread.MIN_PRIORITY);
        t2.setPriority(Thread.MAX_PRIORITY);

        t1.start();
        t2.start();


    }

}

















